package com.curricula.curriculum.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import com.curricula.curriculum.dao.AficionDAO;
import com.curricula.curriculum.dao.Conexion;
import com.curricula.curriculum.dao.CursoDAO;
import com.curricula.curriculum.dao.DireccionDAO;
import com.curricula.curriculum.dao.DocumentacionDAO;
import com.curricula.curriculum.dao.EmailDAO;
import com.curricula.curriculum.dao.EscolarDAO;
import com.curricula.curriculum.dao.HabilidadDAO;
import com.curricula.curriculum.dao.IdiomaDAO;
import com.curricula.curriculum.dao.PersonalDAO;
import com.curricula.curriculum.dao.PublicacionDAO;
import com.curricula.curriculum.dao.TelefonoDAO;
import com.curricula.curriculum.dao.TrabajoDAO;
import com.curricula.curriculum.vo.AficionVO;
import com.curricula.curriculum.vo.ContactoVO;
import com.curricula.curriculum.vo.CurriculumVO;
import com.curricula.curriculum.vo.CursoVO;
import com.curricula.curriculum.vo.DireccionVO;
import com.curricula.curriculum.vo.DocumentacionVO;
import com.curricula.curriculum.vo.EmailVO;
import com.curricula.curriculum.vo.EscolarVO;
import com.curricula.curriculum.vo.HabilidadVO;
import com.curricula.curriculum.vo.IdiomaVO;
import com.curricula.curriculum.vo.PersonalVO;
import com.curricula.curriculum.vo.PublicacionVO;
import com.curricula.curriculum.vo.TelefonoVO;
import com.curricula.curriculum.vo.TrabajoVO;
import com.curricula.usuario.vo.UsuarioVO;

/**
 * Service que ofrece las funciones principales de administracion de datos
 * en el curriculum del usuario
 * 
 * @author Hugo
 * @version 1.0
 * 
 */
public class CurriculumService {
	static Logger log = Logger.getLogger(CurriculumService.class);
	
	/**
	 * Servicio que llena un objeto del tipo CurriculumVO que contiene toda la informaci�n del usuario
	 * los datos con los que se llena se obtienen de los datos que vienen en la request
	 * 
	 * @author Hugo
	 * @param HttpServletRequest request - Donde viajan los parametros con los que se llena el objeto 
	 * @return CurriculumVO
	 * @throws Exception
	 */	
	public static CurriculumVO populate(HttpServletRequest request, UsuarioVO userSesion)throws Exception{		
		CurriculumVO curriculum = new CurriculumVO();
		PersonalVO personalVO = new PersonalVO();
		DireccionVO direccionVO = new DireccionVO();
		TelefonoVO telefonoVO = new TelefonoVO();
		EmailVO emailVO = new EmailVO();
		EscolarVO escolarVO = new EscolarVO();
		TrabajoVO trabajoVO = new TrabajoVO();
		DocumentacionVO documentacionVO = new DocumentacionVO();
		IdiomaVO idiomaVO = new IdiomaVO();
		HabilidadVO habilidadVO = new HabilidadVO();
		CursoVO cursoVO = new CursoVO();
		PublicacionVO publicacionVO = new PublicacionVO();
		AficionVO aficionVO = new AficionVO();
		
		int personal=0;
		int direccion=0;
		int telefono=0;
		int email=0;
		int escolar=0;
		int trabajo=0;
		int documentacion=0;
		int idioma=0;
		int habilidad=0;
		int curso=0;
		int aficion=0;
		int publicacion=0;
		
		List<PersonalVO> listaPersonal = new ArrayList<PersonalVO>();
		List<DireccionVO> listaDireccion = new ArrayList<DireccionVO>(); 
		List<TelefonoVO> listaTelefono = new ArrayList<TelefonoVO>();
		List<EmailVO> listaEmail = new ArrayList<EmailVO>();
		List<EscolarVO> listaEscolar = new ArrayList<EscolarVO>();
		List<TrabajoVO> listaTrabajo = new ArrayList<TrabajoVO>();
		List<DocumentacionVO> listaDocumentacion = new ArrayList<DocumentacionVO>();
		List<IdiomaVO> listaIdioma = new ArrayList<IdiomaVO>();
		List<HabilidadVO> listaHabilidad = new ArrayList<HabilidadVO>();
		List<CursoVO> listaCurso = new ArrayList<CursoVO>();
		List<AficionVO> listaAficion = new ArrayList<AficionVO>();
		List<PublicacionVO> listaPublicacion = new ArrayList<PublicacionVO>();
		
		try {
			/**************		Personal	****************/
			if(request.getParameter("per_nombre")!= null && !request.getParameter("per_nombre").toString().trim().equalsIgnoreCase("")){
				personalVO.setNombre(request.getParameter("per_nombre").toString().trim());
				personal++;
			}
			if(request.getParameter("per_paterno")!= null && !request.getParameter("per_paterno").toString().trim().equalsIgnoreCase("")){
				personalVO.setApellidoPaterno(request.getParameter("per_paterno").toString().trim());	
				personal++;
			}
			if(request.getParameter("per_materno")!= null && !request.getParameter("per_materno").toString().trim().equalsIgnoreCase("")){
				personalVO.setApellidoMaterno(request.getParameter("per_materno").toString().trim());	
				personal++;
			}
			if(request.getParameter("per_edad")!= null && !request.getParameter("per_edad").toString().trim().equalsIgnoreCase("")){
				personalVO.setEdad(Integer.parseInt(request.getParameter("per_edad").toString().trim()));
				personal++;
			}
			if(request.getParameter("per_sexo")!= null && !request.getParameter("per_sexo").toString().trim().equalsIgnoreCase("") && !request.getParameter("per_sexo").toString().trim().equalsIgnoreCase("Selecciona...")){
				personalVO.setSexo(request.getParameter("per_sexo").toString().trim());
				personal++;
			}
			if(request.getParameter("per_edocivil")!= null && !request.getParameter("per_edocivil").toString().trim().equalsIgnoreCase("") && !request.getParameter("per_edocivil").toString().trim().equalsIgnoreCase("Selecciona...")){
				personalVO.setEdoCivil(request.getParameter("per_edocivil").toString().trim());
				personal++;
			}
			if(request.getParameter("per_fnacimiento")!= null && !request.getParameter("per_fnacimiento").toString().trim().equalsIgnoreCase("")){
				personalVO.setFechaNacimiento(request.getParameter("per_fnacimiento").toString().trim());
				personal++;
			}
			if(personal>0)
				listaPersonal.add(personalVO);								
			
			/**************		Direccion	****************/
			if(request.getParameter("dir_calle")!= null && !request.getParameter("dir_calle").toString().trim().equalsIgnoreCase("")){
				direccionVO.setCalle(request.getParameter("dir_calle").toString().trim());
				direccion++;
			}
			if(request.getParameter("dir_numero")!= null && !request.getParameter("dir_numero").toString().trim().equalsIgnoreCase("")){
				direccionVO.setNumero(request.getParameter("dir_numero").toString().trim());
				direccion++;
			}
			if(request.getParameter("dir_interior")!= null && !request.getParameter("dir_interior").toString().trim().equalsIgnoreCase("")){
				direccionVO.setInterior(request.getParameter("dir_interior").toString().trim());
				direccion++;
			}
			if(request.getParameter("dir_colonia")!= null && !request.getParameter("dir_colonia").toString().trim().equalsIgnoreCase("")){
				direccionVO.setColonia(request.getParameter("dir_colonia").toString().trim());
				direccion++;
			}
			if(request.getParameter("dir_cp")!= null && !request.getParameter("dir_cp").toString().trim().equalsIgnoreCase("")){
				direccionVO.setCp(Integer.parseInt(request.getParameter("dir_cp").toString().trim()));
				direccion++;
			}
			if(request.getParameter("dir_ciudad")!= null && !request.getParameter("dir_ciudad").toString().trim().equalsIgnoreCase("")){
				direccionVO.setCiudad(request.getParameter("dir_ciudad").toString().trim());
				direccion++;
			}
			if(request.getParameter("dir_pais")!= null && !request.getParameter("dir_pais").toString().trim().equalsIgnoreCase("")){
				direccionVO.setPais(request.getParameter("dir_pais").toString().trim());
				direccion++;
			}
			if(direccion>0)
				listaDireccion.add(direccionVO);

			/**************		Telefono	****************/
			if(request.getParameter("tel_numero")!= null && !request.getParameter("tel_numero").toString().trim().equalsIgnoreCase("")){
				telefonoVO.setNumero(request.getParameter("tel_numero").toString().trim());
				telefono++;
			}
			if(request.getParameter("tel_tipo")!= null && !request.getParameter("tel_tipo").toString().trim().equalsIgnoreCase("") && !request.getParameter("tel_tipo").toString().trim().equalsIgnoreCase("Selecciona...")){
				telefonoVO.setTipo(request.getParameter("tel_tipo").toString().trim());
				telefono++;
			}
			if(telefono>0)
				listaTelefono.add(telefonoVO);
			
			/**************		Email	****************/
			if(request.getParameter("ema_correo")!= null && !request.getParameter("ema_correo").toString().trim().equalsIgnoreCase("")){
				emailVO.setCorreo(request.getParameter("ema_correo").toString().trim());
				email++;
			}
			if(request.getParameter("ema_tipo")!= null && !request.getParameter("ema_tipo").toString().trim().equalsIgnoreCase("") && !request.getParameter("ema_tipo").toString().trim().equalsIgnoreCase("Selecciona...")){
				emailVO.setTipo(request.getParameter("ema_tipo").toString().trim());
				email++;
			}
			if(email>0)
				listaEmail.add(emailVO);
			
			/**************		Escolar 	****************/
			if(request.getParameter("esc_institucion")!= null && !request.getParameter("esc_institucion").toString().trim().equalsIgnoreCase("")){
				escolarVO.setInstitucion(request.getParameter("esc_institucion").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_clave")!= null && !request.getParameter("esc_clave").toString().trim().equalsIgnoreCase("")){
				escolarVO.setClave(request.getParameter("esc_clave").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_nivel")!= null && !request.getParameter("esc_nivel").toString().trim().equalsIgnoreCase("") && !request.getParameter("esc_nivel").toString().trim().equalsIgnoreCase("Selecciona...")){
				escolarVO.setNivel(request.getParameter("esc_nivel").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_especialidad")!= null && !request.getParameter("esc_especialidad").toString().trim().equalsIgnoreCase("")){
				escolarVO.setEspecialidad(request.getParameter("esc_especialidad").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_titulo")!= null && !request.getParameter("esc_titulo").toString().trim().equalsIgnoreCase("")){
				escolarVO.setTituloObtenido(request.getParameter("esc_titulo").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_finicio")!= null && !request.getParameter("esc_finicio").toString().trim().equalsIgnoreCase("")){
				escolarVO.setFechaInicio(request.getParameter("esc_finicio").toString().trim());
				escolar++;
			}
			if(request.getParameter("esc_ffinal")!= null && !request.getParameter("esc_ffinal").toString().trim().equalsIgnoreCase("")){
				escolarVO.setFechaFinal(request.getParameter("esc_ffinal").toString().trim());
				escolar++;
			}
			if(escolar>0)
				listaEscolar.add(escolarVO);
			
			/**************		Experiencia Laboral 	****************/
			if(request.getParameter("tra_empresa")!= null && !request.getParameter("tra_empresa").toString().trim().equalsIgnoreCase("")){
				trabajoVO.setEmpresa(request.getParameter("tra_empresa").toString().trim());
				trabajo++;
			}
			if(request.getParameter("tra_puesto")!= null && !request.getParameter("tra_puesto").toString().trim().equalsIgnoreCase("")){
				trabajoVO.setPuesto(request.getParameter("tra_puesto").toString().trim());
				trabajo++;
			}
			if(request.getParameter("tra_jefe")!= null && !request.getParameter("tra_jefe").toString().trim().equalsIgnoreCase("")){
				trabajoVO.setJefe(request.getParameter("tra_jefe").toString().trim());
				trabajo++;
			}
			if(request.getParameter("tra_finicio")!= null && !request.getParameter("tra_finicio").toString().trim().equalsIgnoreCase("")){
				trabajoVO.setFechaInicio(request.getParameter("tra_finicio").toString().trim());
				trabajo++;
			}
			if(request.getParameter("tra_ffinal")!= null && !request.getParameter("tra_ffinal").toString().trim().equalsIgnoreCase("")){
				trabajoVO.setFechaFin(request.getParameter("tra_ffinal").toString().trim());
				trabajo++;
			}
			if(trabajo>0)
				listaTrabajo.add(trabajoVO);
			
			/**************		Documentacion 	****************/
			if(request.getParameter("doc_documento")!= null && !request.getParameter("doc_documento").toString().trim().equalsIgnoreCase("")){
				documentacionVO.setDocumento(request.getParameter("doc_documento").toString().trim());
				documentacion++;
			}
			if(request.getParameter("doc_tipo")!= null && !request.getParameter("doc_tipo").toString().trim().equalsIgnoreCase("")){
				documentacionVO.setTipo(request.getParameter("doc_tipo").toString().trim());
				documentacion++;
			}
			if(request.getParameter("doc_clase")!= null && !request.getParameter("doc_clase").toString().trim().equalsIgnoreCase("")){
				documentacionVO.setClase(request.getParameter("doc_clase").toString().trim());
				documentacion++;
			}
			if(request.getParameter("doc_clave")!= null && !request.getParameter("doc_clave").toString().trim().equalsIgnoreCase("")){
				documentacionVO.setClave(request.getParameter("doc_clave").toString().trim());
				documentacion++;
			}
			if(request.getParameter("doc_vigencia")!= null && !request.getParameter("doc_vigencia").toString().trim().equalsIgnoreCase("")){
				documentacionVO.setVigencia(request.getParameter("doc_vigencia").toString().trim());
				documentacion++;
			}
			if(documentacion>0)
				listaDocumentacion.add(documentacionVO);
			
			/**************		Idioma 	****************/
			if(request.getParameter("idi_institucion")!= null && !request.getParameter("idi_institucion").toString().trim().equalsIgnoreCase("")){
				idiomaVO.setInstitucion(request.getParameter("idi_institucion").toString().trim());
				idioma++;
			}
			if(request.getParameter("idi_nHablado")!= null && !request.getParameter("idi_nHablado").toString().trim().equalsIgnoreCase("")){
				idiomaVO.setNivelHablado(Integer.parseInt(request.getParameter("idi_nHablado").toString().trim()));
				idioma++;
			}
			if(request.getParameter("idi_nHablado")!= null && !request.getParameter("idi_nHablado").toString().trim().equalsIgnoreCase("")){
				idiomaVO.setNivelHablado(Integer.parseInt(request.getParameter("idi_nHablado").toString().trim()));
				idioma++;
			}
			if(request.getParameter("idi_nEscrito")!= null && !request.getParameter("idi_nEscrito").toString().trim().equalsIgnoreCase("")){
				idiomaVO.setNivelEscrito(Integer.parseInt(request.getParameter("idi_nEscrito").toString().trim()));
				idioma++;
			}
			if(request.getParameter("idi_titulo")!= null && !request.getParameter("idi_titulo").toString().trim().equalsIgnoreCase("")){
				idiomaVO.setTitulo(request.getParameter("idi_titulo").toString().trim());
				idioma++;
			}
			if(idioma>0)
				listaIdioma.add(idiomaVO);
			
			/**************		Habilidades 	****************/
			if(request.getParameter("hab_habilidad")!= null && !request.getParameter("hab_habilidad").toString().trim().equalsIgnoreCase("")){
				habilidadVO.setHabilidad(request.getParameter("hab_habilidad").toString().trim());
				habilidad++;
			}
			if(request.getParameter("hab_tipo")!= null && !request.getParameter("hab_tipo").toString().trim().equalsIgnoreCase("")){
				habilidadVO.setTipo(request.getParameter("hab_tipo").toString().trim());
				habilidad++;
			}
			if(request.getParameter("hab_tExperiencia")!= null && !request.getParameter("hab_tExperiencia").toString().trim().equalsIgnoreCase("")){
				habilidadVO.setTiempoExperiencia(request.getParameter("hab_tExperiencia").toString().trim());
				habilidad++;
			}
			if(habilidad>0)
				listaHabilidad.add(habilidadVO);
			
			/**************		Cursos 	****************/
			if(request.getParameter("cur_institucion")!= null && !request.getParameter("cur_institucion").toString().trim().equalsIgnoreCase("")){
				cursoVO.setInstitucion(request.getParameter("cur_institucion").toString().trim());
				curso++;
			}
			if(request.getParameter("cur_tema")!= null && !request.getParameter("cur_tema").toString().trim().equalsIgnoreCase("")){
				cursoVO.setTema(request.getParameter("cur_tema").toString().trim());
				curso++;
			}
			if(request.getParameter("cur_tipo")!= null && !request.getParameter("cur_tipo").toString().trim().equalsIgnoreCase("")){
				cursoVO.setTipo(request.getParameter("cur_tipo").toString().trim());
				curso++;
			}
			if(request.getParameter("cur_fechaInicio")!= null && !request.getParameter("cur_fechaInicio").toString().trim().equalsIgnoreCase("")){
				cursoVO.setFechaInicio(request.getParameter("cur_fechaInicio").toString().trim());
				curso++;
			}
			if(request.getParameter("cur_fechaFinal")!= null && !request.getParameter("cur_fechaFinal").toString().trim().equalsIgnoreCase("")){
				cursoVO.setFechaFinal(request.getParameter("cur_fechaFinal").toString().trim());
				curso++;
			}
			if(curso>0)
				listaCurso.add(cursoVO);
			
			/**************		Publicaciones 	****************/
			if(request.getParameter("pub_titulo")!= null && !request.getParameter("pub_titulo").toString().trim().equalsIgnoreCase("")){
				publicacionVO.setTitulo(request.getParameter("pub_titulo").toString().trim());
				publicacion++;
			}
			if(request.getParameter("pub_descripcion")!= null && !request.getParameter("pub_descripcion").toString().trim().equalsIgnoreCase("")){
				publicacionVO.setDescripcion(request.getParameter("pub_descripcion").toString().trim());
				publicacion++;
			}
			if(request.getParameter("pub_fecha")!= null && !request.getParameter("pub_fecha").toString().trim().equalsIgnoreCase("")){
				publicacionVO.setFecha(request.getParameter("pub_fecha").toString().trim());
				publicacion++;
			}
			if(request.getParameter("pub_comentario")!= null && !request.getParameter("pub_comentario").toString().trim().equalsIgnoreCase("")){
				publicacionVO.setComentario(request.getParameter("pub_comentario").toString().trim());
				publicacion++;
			}
			if(publicacion>0)
				listaPublicacion.add(publicacionVO);
			
			/**************		Aficiones 	****************/
			if(request.getParameter("afi_aficion")!= null && !request.getParameter("afi_aficion").toString().trim().equalsIgnoreCase("")){
				aficionVO.setAficion(request.getParameter("afi_aficion").toString().trim());
				aficion++;
			}
			if(request.getParameter("afi_tPractica")!= null && !request.getParameter("afi_tPractica").toString().trim().equalsIgnoreCase("")){
				aficionVO.setTiempoPractica(request.getParameter("afi_tPractica").toString().trim());
				aficion++;
			}
			if(request.getParameter("afi_tipo")!= null && !request.getParameter("afi_tipo").toString().trim().equalsIgnoreCase("")){
				aficionVO.setTipo(request.getParameter("afi_tipo").toString().trim());
				aficion++;
			}
			if(aficion>0)
				listaAficion.add(aficionVO);
				
			curriculum.setListaAficion(listaAficion);
			curriculum.setListaCurso(listaCurso);
			curriculum.setListaDireccion(listaDireccion);
			curriculum.setListaDocumentacion(listaDocumentacion);
			curriculum.setListaEmail(listaEmail);
			curriculum.setListaEscolar(listaEscolar);
			curriculum.setListaHabilidad(listaHabilidad);
			curriculum.setListaIdioma(listaIdioma);
			curriculum.setListaPersonal(listaPersonal);
			curriculum.setListaTelefono(listaTelefono);
			curriculum.setListaTrabajo(listaTrabajo);
			curriculum.setListaPublicacion(listaPublicacion);
			
		} catch (Exception e) {
			log.error("Error al llenar el objeto: "+e);
			throw e;
		}
		return curriculum;		
	}
	
	/**
	 * Servicio que realiza la busqueda del perfil deseado con los parametros que vienen en el 
	 * filtro del objeto curriculumVO que llega.
	 * 
	 * @author Hugo
	 * @param CurriculumVO curriculum
	 * @return List con todos los registros que coincidieron con el filtro
	 * @throws SQLException
	 */
	public static List<ContactoVO> buscar(CurriculumVO curriculum, String criterio) throws SQLException{
		List<PersonalVO> listaPersonal;
		List<DireccionVO> listaDireccion; 
		List<TelefonoVO> listaTelefono;
		List<EmailVO> listaEmail;
		List<EscolarVO> listaEscolar;
		List<TrabajoVO> listaTrabajo;
		List<DocumentacionVO> listaDocumentacion;
		List<IdiomaVO> listaIdioma;
		List<HabilidadVO> listaHabilidad;
		List<CursoVO> listaCurso;
		List<PublicacionVO> listaPublicacion;
		List<AficionVO> listaAficion;
		List<String> idResultado = new ArrayList<String>();
		List<PersonalVO> encontrados = new ArrayList<PersonalVO>();
		List<ContactoVO> contactos = new ArrayList<ContactoVO>();
		int parametro =0;
		int encontrado =0;		
		
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			
			if(curriculum.getListaPersonal().size()>0){
				parametro++;
				listaPersonal = PersonalDAO.find(curriculum.getListaPersonal().get(0), conn);
				if(listaPersonal!=null && listaPersonal.size()>0){
					encontrado++;
					Iterator<PersonalVO> it = listaPersonal.iterator();
					while(it.hasNext()){
						PersonalVO p = (PersonalVO) it.next();
							idResultado.add(String.valueOf(p.getId()));
					}
				}
			}
			if(curriculum.getListaDireccion().size()>0){
				parametro++;
				listaDireccion = DireccionDAO.find(curriculum.getListaDireccion().get(0), conn);
				if(listaDireccion.size()>0){
					encontrado++;
					Iterator<DireccionVO> it = listaDireccion.iterator();
					while(it.hasNext()){
						DireccionVO d = (DireccionVO) it.next();					
						idResultado.add(String.valueOf(d.getIdUser()));					
					}
				}
			}
			if(curriculum.getListaTelefono().size()>0){
				parametro++;
				listaTelefono = TelefonoDAO.find(curriculum.getListaTelefono().get(0), conn);
				if(listaTelefono.size()>0){
					encontrado++;
					Iterator<TelefonoVO> it = listaTelefono.iterator();
					while(it.hasNext()){
						TelefonoVO t = (TelefonoVO) it.next();
						idResultado.add(String.valueOf(t.getIdUser()));
					}
				}
			}
			if(curriculum.getListaEmail().size()>0){
				parametro++;
				listaEmail = EmailDAO.find(curriculum.getListaEmail().get(0), conn);
				if(listaEmail.size()>0){
					encontrado++;
					Iterator<EmailVO> it = listaEmail.iterator();
					while(it.hasNext()){
						EmailVO e = (EmailVO) it.next();
						idResultado.add(String.valueOf(e.getIdUser()));
					}
				}
			}
			if(curriculum.getListaEscolar().size()>0){
				parametro++;
				listaEscolar = EscolarDAO.find(curriculum.getListaEscolar().get(0), conn);
				if(listaEscolar.size()>0){
					encontrado++;
					Iterator<EscolarVO> it = listaEscolar.iterator();
					while(it.hasNext()){
						EscolarVO e = (EscolarVO) it.next();
						idResultado.add(String.valueOf(e.getIdUser()));
					}
				}
			}
			if(curriculum.getListaTrabajo().size()>0){
				parametro++;
				listaTrabajo = TrabajoDAO.find(curriculum.getListaTrabajo().get(0), conn);
				if(listaTrabajo.size()>0){
					encontrado++;
					Iterator<TrabajoVO> it = listaTrabajo.iterator();
					while(it.hasNext()){
						TrabajoVO t = (TrabajoVO) it.next();
						idResultado.add(String.valueOf(t.getIdUser()));
					}
				}
			}
			if(curriculum.getListaDocumentacion().size()>0){
				parametro++;
				listaDocumentacion = DocumentacionDAO.find(curriculum.getListaDocumentacion().get(0), conn);
				if(listaDocumentacion.size()>0){
					encontrado++;
					Iterator<DocumentacionVO> it = listaDocumentacion.iterator();
					while(it.hasNext()){
						DocumentacionVO d = (DocumentacionVO) it.next();
						idResultado.add(String.valueOf(d.getIdUser()));
					}
				}
			}
			if(curriculum.getListaIdioma().size()>0){
				parametro++;
				listaIdioma = IdiomaDAO.find(curriculum.getListaIdioma().get(0), conn);
				if(listaIdioma.size()>0){
					encontrado++;
					Iterator<IdiomaVO> it = listaIdioma.iterator();
					while(it.hasNext()){
						IdiomaVO i = (IdiomaVO) it.next();
						idResultado.add(String.valueOf(i.getIdUser()));
					}
				}
			}
			if(curriculum.getListaHabilidad().size()>0){
				parametro++;
				listaHabilidad = HabilidadDAO.find(curriculum.getListaHabilidad().get(0), conn);
				if(listaHabilidad.size()>0){
					encontrado++;
					Iterator<HabilidadVO> it = listaHabilidad.iterator();
					while(it.hasNext()){
						HabilidadVO h = (HabilidadVO) it.next();
						idResultado.add(String.valueOf(h.getIdUser()));
					}
				}
			}
			if(curriculum.getListaCurso().size()>0){
				parametro++;
				listaCurso = CursoDAO.find(curriculum.getListaCurso().get(0), conn);
				if(listaCurso.size()>0){
					encontrado++;
					Iterator<CursoVO> it = listaCurso.iterator();
					while(it.hasNext()){
						CursoVO c = (CursoVO) it.next();
						idResultado.add(String.valueOf(c.getIdUser()));
					}
				}
			}
			if(curriculum.getListaPublicacion().size()>0){
				parametro++;
				listaPublicacion = PublicacionDAO.find(curriculum.getListaPublicacion().get(0), conn);
				if(listaPublicacion.size()>0){
					encontrado++;
					Iterator<PublicacionVO> it = listaPublicacion.iterator();
					while(it.hasNext()){
						PublicacionVO p = (PublicacionVO) it.next();
						idResultado.add(String.valueOf(p.getIdUser()));
					}
				}
			}
			if(curriculum.getListaAficion().size()>0){
				parametro++;
				listaAficion = AficionDAO.find(curriculum.getListaAficion().get(0), conn);
				if(listaAficion.size()>0){
					encontrado++;
					Iterator<AficionVO> it = listaAficion.iterator();
					while(it.hasNext()){
						AficionVO a = (AficionVO) it.next();
						idResultado.add(String.valueOf(a.getIdUser()));
					}
				}
			}
			
			if((criterio.equalsIgnoreCase("y") && parametro==encontrado) || (criterio.equalsIgnoreCase("o") && encontrado>0)){			
				for(int i=0; i<idResultado.size();i++){
					ContactoVO contacto = new ContactoVO();					
					PersonalVO buscarPersonal = new PersonalVO();
					PersonalVO encontradoPersonal = new PersonalVO();
					DireccionVO buscarDireccion = new DireccionVO();
					DireccionVO encontradoDireccion = new DireccionVO();
					TelefonoVO buscarTelefono = new TelefonoVO();
					TelefonoVO encontradoTelefono = new TelefonoVO();
					EmailVO buscarEmail = new EmailVO();
					EmailVO encontradoEmail = new EmailVO();
					
					buscarDireccion.setIdUser(Integer.parseInt(idResultado.get(i).toString()));					
					buscarPersonal.setId(Integer.parseInt(idResultado.get(i).toString()));
					buscarTelefono.setIdUser(Integer.parseInt(idResultado.get(i).toString()));
					buscarEmail.setIdUser(Integer.parseInt(idResultado.get(i).toString()));
					
					listaDireccion = DireccionService.obtener(buscarDireccion);
					if(listaDireccion.size()>0)
						encontradoDireccion = listaDireccion.get(0);
					listaTelefono = TelefonoService.obtener(buscarTelefono);
					if(listaTelefono.size()>0)
						encontradoTelefono = listaTelefono.get(0);
					listaEmail = EmailService.obtener(buscarEmail);
					if(listaEmail.size()>0)
						encontradoEmail = listaEmail.get(0);						
					
					encontradoPersonal = PersonalService.obtener(buscarPersonal);
					
					if(!encontrados.contains(encontradoPersonal)){
						contacto.setDireccion(encontradoDireccion.toString());
						contacto.setTelefono(encontradoTelefono.getNumero());
						contacto.setEmail(encontradoEmail.getCorreo());
						contacto.setNombre(encontradoPersonal.toString());
						contacto.setIdUser(String.valueOf(encontradoPersonal.getId()));
						contactos.add(contacto);
						encontrados.add(encontradoPersonal);
					}
				}
			}
		
		}catch(SQLException e){
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return contactos;		
	}
	
	/**
	 * Servicio que realiza la busqueda del perfil deseado con los parametros que vienen en el 
	 * filtro del objeto curriculumVO que llega.
	 * 
	 * @author Hugo
	 * @param CurriculumVO curriculum
	 * @return List con todos los registros que coincidieron con el filtro
	 * @throws SQLException
	 */
	public static CurriculumVO buscar(UsuarioVO usuario) throws SQLException{
		CurriculumVO encontrado = new CurriculumVO();
		
		PersonalVO personalVO = new PersonalVO();
		personalVO.setId(usuario.getUsrId());

		DireccionVO direccionVO = new DireccionVO();
		direccionVO.setIdUser(usuario.getUsrId());
		direccionVO.setVisible(usuario.getVisible());
		TelefonoVO telefonoVO = new TelefonoVO();
		telefonoVO.setIdUser(usuario.getUsrId());
		telefonoVO.setVisible(usuario.getVisible());
		EmailVO emailVO = new EmailVO();
		emailVO.setIdUser(usuario.getUsrId());
		emailVO.setVisible(usuario.getVisible());
		EscolarVO escolarVO = new EscolarVO();
		escolarVO.setIdUser(usuario.getUsrId());
		escolarVO.setVisible(usuario.getVisible());
		TrabajoVO trabajoVO = new TrabajoVO();
		trabajoVO.setIdUser(usuario.getUsrId());
		trabajoVO.setVisible(usuario.getVisible());
		DocumentacionVO documentacionVO = new DocumentacionVO();
		documentacionVO.setIdUser(usuario.getUsrId());
		documentacionVO.setVisible(usuario.getVisible());
		IdiomaVO idiomaVO = new IdiomaVO();
		idiomaVO.setIdUser(usuario.getUsrId());
		idiomaVO.setVisible(usuario.getVisible());
		HabilidadVO habilidadVO = new HabilidadVO();
		habilidadVO.setIdUser(usuario.getUsrId());
		habilidadVO.setVisible(usuario.getVisible());
		CursoVO cursoVO = new CursoVO();
		cursoVO.setIdUser(usuario.getUsrId());
		cursoVO.setVisible(usuario.getVisible());
		PublicacionVO publicacionVO = new PublicacionVO();
		publicacionVO.setIdUser(usuario.getUsrId());
		publicacionVO.setVisible(usuario.getVisible());
		AficionVO aficionVO = new AficionVO();
		aficionVO.setIdUser(usuario.getUsrId());		
		aficionVO.setVisible(usuario.getVisible());
		
		Connection conn = null;
		try{
			conn = Conexion.getConexion();
			conn.setAutoCommit(false);
			
			encontrado.setListaPersonal(PersonalDAO.find(personalVO, conn));
			encontrado.setListaDireccion(DireccionDAO.find(direccionVO, conn));
			encontrado.setListaTelefono(TelefonoDAO.find(telefonoVO, conn));
			encontrado.setListaEmail(EmailDAO.find(emailVO, conn));
			encontrado.setListaEscolar(EscolarDAO.find(escolarVO, conn));
			encontrado.setListaTrabajo(TrabajoDAO.find(trabajoVO, conn));
			encontrado.setListaDocumentacion(DocumentacionDAO.find(documentacionVO, conn));
			encontrado.setListaIdioma(IdiomaDAO.find(idiomaVO, conn));
			encontrado.setListaHabilidad(HabilidadDAO.find(habilidadVO, conn));
			encontrado.setListaCurso(CursoDAO.find(cursoVO, conn));
			encontrado.setListaPublicacion(PublicacionDAO.find(publicacionVO, conn));
			encontrado.setListaAficion(AficionDAO.find(aficionVO, conn));
		
		}catch(SQLException e){
			log.error("Error de SQL: "+ e);
			throw e;
		}finally{
			if(conn!= null)
				try {
					conn.close();
				} catch (SQLException e) {
					log.error("Error al cerrar la conexion: "+ e);
				}				
		}
		return encontrado;		
	}
}
